| @@ -7,11 +7,14 @@ from django_logit import logit | ||
| 7 | 7 | from django_response import response | 
| 8 | 8 | from paginator import pagination | 
| 9 | 9 | from TimeConvert import TimeConvert as tc | 
| 10 | +from django.db.models import Q | |
| 11 | + | |
| 10 | 12 |  | 
| 11 | 13 | from api.tenancy_views import tenancy_tracking_info_subscribe | 
| 12 | 14 | from kodo.decorators import check_admin | 
| 13 | 15 | from tenancy.models import TenancyShotInfo, TenancyShotRequestInfo | 
| 14 | 16 | from utils.error.errno_utils import TenancyStatusCode | 
| 17 | +from utils.kuaidi.synquery import KuaiDi100 | |
| 15 | 18 |  | 
| 16 | 19 |  | 
| 17 | 20 | @logit | 
| @@ -19,14 +22,19 @@ from utils.error.errno_utils import TenancyStatusCode | ||
| 19 | 22 | def shot_list(request, administrator): | 
| 20 | 23 |      page = request.POST.get('page', 1) | 
| 21 | 24 |      num = request.POST.get('num', 20) | 
| 25 | +    query = request.POST.get('query', '') | |
| 22 | 26 |  | 
| 23 | 27 |      shots = TenancyShotInfo.objects.filter(status=True).order_by('-pk') | 
| 28 | + if query: | |
| 29 | + shots = shots.filter(Q(sn__icontains=query)) | |
| 30 | + count = shots.count() | |
| 24 | 31 | shots = [shot.data for shot in shots] | 
| 25 | 32 | shots, left = pagination(shots, page, num) | 
| 26 | 33 |  | 
| 27 | 34 |      return response(data={ | 
| 28 | 35 | 'shots': shots, | 
| 29 | 36 | 'left': left, | 
| 37 | + 'count': count, | |
| 30 | 38 | }) | 
| 31 | 39 |  | 
| 32 | 40 |  | 
| @@ -111,14 +119,32 @@ def shot_update(request, administrator): | ||
| 111 | 119 | def shot_request_list(request, administrator): | 
| 112 | 120 |      page = request.POST.get('page', 1) | 
| 113 | 121 |      num = request.POST.get('num', 20) | 
| 122 | +    query = request.POST.get('query', '') | |
| 123 | +    start_time = request.POST.get('start_time', '') | |
| 124 | +    end_time = request.POST.get('end_time', '') | |
| 125 | +    request_status = request.POST.get('request_status', 'all') | |
| 114 | 126 |  | 
| 115 | 127 |      reqs = TenancyShotRequestInfo.objects.filter(status=True).order_by('-pk') | 
| 116 | - reqs = [req.data for req in reqs] | |
| 128 | + | |
| 129 | + if query: | |
| 130 | + reqs = reqs.filter(Q(phone__icontains=query), Q(name__icontains=query)) | |
| 131 | + | |
| 132 | + if request_status != 'all': | |
| 133 | + reqs = reqs.filter(request_status=request_status) | |
| 134 | + | |
| 135 | + if start_time and end_time: | |
| 136 | + start_time = tc.string_to_utc_datetime(start_time, format='%Y%m%d') | |
| 137 | + end_time = tc.string_to_utc_datetime(end_time + ' 23:59:59', format='%Y%m%d %H:%M:%S') | |
| 138 | + maintenances = maintenances.filter(created_at__range=(start_time, end_time)) | |
| 139 | + | |
| 140 | + count = reqs.count() | |
| 141 | + reqs = [req.admindata for req in reqs] | |
| 117 | 142 | reqs, left = pagination(reqs, page, num) | 
| 118 | 143 |  | 
| 119 | 144 |      return response(data={ | 
| 120 | 145 | 'reqs': reqs, | 
| 121 | 146 | 'left': left, | 
| 147 | + 'count': count, | |
| 122 | 148 | }) | 
| 123 | 149 |  | 
| 124 | 150 |  | 
| @@ -133,7 +159,7 @@ def shot_request_detail(request, administrator): | ||
| 133 | 159 | return response(TenancyStatusCode.TENANCY_SHOT_REQUEST_NOT_FOUND) | 
| 134 | 160 |  | 
| 135 | 161 |      return response(data={ | 
| 136 | - 'req': req.data, | |
| 162 | + 'req': req.admindata, | |
| 137 | 163 | }) | 
| 138 | 164 |  | 
| 139 | 165 |  | 
| @@ -150,7 +176,11 @@ def shot_request_update(request, administrator): | ||
| 150 | 176 |      purpose = request.POST.get('purpose', '') | 
| 151 | 177 |      return_date = request.POST.get('return_date', '') | 
| 152 | 178 |      request_status = request.POST.get('request_status', '') | 
| 179 | +    express_name = request.POST.get('express_name', '') | |
| 180 | +    express_com = request.POST.get('express_com', '') | |
| 153 | 181 |      tracking_number = request.POST.get('tracking_number', '') | 
| 182 | +    back_express_name = request.POST.get('back_express_name', '') | |
| 183 | +    back_express_com = request.POST.get('back_express_com', '') | |
| 154 | 184 |      back_tracking_number = request.POST.get('back_tracking_number', '') | 
| 155 | 185 |  | 
| 156 | 186 | try: | 
| @@ -177,8 +207,16 @@ def shot_request_update(request, administrator): | ||
| 177 | 207 | req.return_date = tc.to_date(return_date) | 
| 178 | 208 | if request_status: | 
| 179 | 209 | req.request_status = request_status | 
| 210 | + if express_name: | |
| 211 | + req.express_name = express_name | |
| 212 | + if express_com: | |
| 213 | + req.express_com = express_com | |
| 180 | 214 | if tracking_number: | 
| 181 | 215 | req.tracking_number = tracking_number | 
| 216 | + if back_express_name: | |
| 217 | + req.back_express_name = back_express_name | |
| 218 | + if back_express_com: | |
| 219 | + req.back_express_com = back_express_com | |
| 182 | 220 | if back_tracking_number: | 
| 183 | 221 | req.back_tracking_number = back_tracking_number | 
| 184 | 222 | req.save() | 
| @@ -189,7 +227,7 @@ def shot_request_update(request, administrator): | ||
| 189 | 227 | tenancy_tracking_info_subscribe(req, 'back_tracking') | 
| 190 | 228 |  | 
| 191 | 229 |      return response(data={ | 
| 192 | - 'req': req.data, | |
| 230 | + 'req': req.admindata, | |
| 193 | 231 | }) | 
| 194 | 232 |  | 
| 195 | 233 |  | 
| @@ -209,7 +247,7 @@ def shot_request_audit(request, administrator): | ||
| 209 | 247 | req.save() | 
| 210 | 248 |  | 
| 211 | 249 |      return response(data={ | 
| 212 | - 'req': req.data, | |
| 250 | + 'req': req.admindata, | |
| 213 | 251 | }) | 
| 214 | 252 |  | 
| 215 | 253 |  | 
| @@ -218,6 +256,8 @@ def shot_request_audit(request, administrator): | ||
| 218 | 256 | @transaction.atomic | 
| 219 | 257 | def shot_request_send(request, administrator): | 
| 220 | 258 |      req_id = request.POST.get('req_id') or request.POST.get('request_id') | 
| 259 | +    express_name = request.POST.get('express_name', '') | |
| 260 | +    express_com = request.POST.get('express_com', '') | |
| 221 | 261 |      tracking_number = request.POST.get('tracking_number', '') | 
| 222 | 262 |  | 
| 223 | 263 | try: | 
| @@ -225,11 +265,20 @@ def shot_request_send(request, administrator): | ||
| 225 | 265 | except TenancyShotRequestInfo.DoesNotExist: | 
| 226 | 266 | return response(TenancyStatusCode.TENANCY_SHOT_REQUEST_NOT_FOUND) | 
| 227 | 267 |  | 
| 268 | + old_tracking_number = req.tracking_number | |
| 269 | + | |
| 270 | + req.express_name = express_name | |
| 271 | + req.express_com = express_com | |
| 228 | 272 | req.tracking_number = tracking_number | 
| 273 | + req.request_status = TenancyShotRequestInfo.TENANCY_TRACKING_SEND | |
| 274 | +    req.request_status_at = {TenancyShotRequestInfo.TENANCY_TRACKING_SEND: tc.utc_datetime()} | |
| 229 | 275 | req.save() | 
| 230 | 276 |  | 
| 277 | + if tracking_number and tracking_number != old_tracking_number: | |
| 278 | + tenancy_tracking_info_subscribe(req, 'tracking') | |
| 279 | + | |
| 231 | 280 |      return response(data={ | 
| 232 | - 'req': req.data, | |
| 281 | + 'req': req.admindata, | |
| 233 | 282 | }) | 
| 234 | 283 |  | 
| 235 | 284 |  | 
| @@ -245,8 +294,49 @@ def shot_request_signed(request, administrator): | ||
| 245 | 294 | return response(TenancyStatusCode.TENANCY_SHOT_REQUEST_NOT_FOUND) | 
| 246 | 295 |  | 
| 247 | 296 | req.request_status = TenancyShotRequestInfo.TENANCY_TRACKING_BACK_SIGNED | 
| 297 | + request_status_at = req.request_status_at | |
| 298 | + request_status_at[TenancyShotRequestInfo.TENANCY_TRACKING_BACK_SIGNED] = tc.utc_datetime() | |
| 299 | + req.request_status_at = request_status_at | |
| 248 | 300 | req.save() | 
| 249 | 301 |  | 
| 250 | 302 |      return response(data={ | 
| 251 | - 'req': req.data, | |
| 303 | + 'req': req.admindata, | |
| 304 | + }) | |
| 305 | + | |
| 306 | + | |
| 307 | +@logit | |
| 308 | +@check_admin | |
| 309 | +def shot_request_tracking_info(request): | |
| 310 | +    request_id = request.POST.get('request_id', '') | |
| 311 | +    type_ = request.POST.get('type', 'tracking')  # tracking / back_tracking | |
| 312 | + | |
| 313 | + try: | |
| 314 | + req = TenancyShotRequestInfo.objects.get(pk=maintenance_id, status=True) | |
| 315 | + except TenancyShotRequestInfo.DoesNotExist: | |
| 316 | + return response(TenancyStatusCode.TENANCY_SHOT_REQUEST_NOT_FOUND) | |
| 317 | + | |
| 318 | +    tracking_info = {} | |
| 319 | + if type_ == 'tracking': | |
| 320 | + if req.express_com and req.tracking_number: | |
| 321 | + tracking_info = KuaiDi100().track(req.express_com, req.tracking_number) | |
| 322 | + req.tracking_info = tracking_info | |
| 323 | + req.save() | |
| 324 | + else: | |
| 325 | + if req.back_express_com and req.back_tracking_number: | |
| 326 | + tracking_info = KuaiDi100().track(req.back_express_com, req.back_tracking_number) | |
| 327 | + req.back_tracking_info = tracking_info | |
| 328 | + req.save() | |
| 329 | + | |
| 330 | + if tracking_info: | |
| 331 | + try: | |
| 332 | + tracking_info = json.loads(tracking_info) | |
| 333 | + except Exception: | |
| 334 | +            tracking_info = {} | |
| 335 | + | |
| 336 | + if tracking_info: | |
| 337 | + tenancy_tracking_info_subscribe(req, 'tracking') | |
| 338 | + | |
| 339 | +    return response(data={ | |
| 340 | + 'type': type_, | |
| 341 | + 'tracking_info': tracking_info, | |
| 252 | 342 | }) | 
| @@ -23,7 +23,7 @@ def shot_list(request): | ||
| 23 | 23 |      page = request.POST.get('page', 1) | 
| 24 | 24 |      num = request.POST.get('num', 20) | 
| 25 | 25 |  | 
| 26 | -    shots = TenancyShotInfo.objects.filter(status=True).order_by('-pk') | |
| 26 | +    shots = TenancyShotInfo.objects.filter(tenancy_status=0, status=True).order_by('-pk') | |
| 27 | 27 | shots = [shot.data for shot in shots] | 
| 28 | 28 | shots, left = pagination(shots, page, num) | 
| 29 | 29 |  | 
| @@ -119,6 +119,9 @@ def shot_request_signed(request): | ||
| 119 | 119 |  | 
| 120 | 120 | req.tracking_signed_images = signed_images | 
| 121 | 121 | req.request_status = TenancyShotRequestInfo.TENANCY_TRACKING_SEND_SIGNED | 
| 122 | + request_status_at = req.request_status_at | |
| 123 | + request_status_at[TenancyShotRequestInfo.TENANCY_TRACKING_SEND_SIGNED] = tc.utc_datetime() | |
| 124 | + req.request_status_at = request_status_at | |
| 122 | 125 | req.save() | 
| 123 | 126 |  | 
| 124 | 127 |      return response(data={ | 
| @@ -131,6 +134,8 @@ def shot_request_signed(request): | ||
| 131 | 134 | def shot_request_sendback(request): | 
| 132 | 135 |      req_id = request.POST.get('req_id') or request.POST.get('request_id') | 
| 133 | 136 |      user_id = request.POST.get('user_id', '') | 
| 137 | +    back_express_com = request.POST.get('back_express_com', '') | |
| 138 | +    back_express_name = request.POST.get('back_express_name', '') | |
| 134 | 139 |      back_tracking_number = request.POST.get('back_tracking_number', '') | 
| 135 | 140 |  | 
| 136 | 141 | try: | 
| @@ -140,8 +145,13 @@ def shot_request_sendback(request): | ||
| 140 | 145 |  | 
| 141 | 146 | old_back_tracking_number = req.back_tracking_number | 
| 142 | 147 |  | 
| 148 | + req.back_express_com = back_express_com | |
| 149 | + req.back_express_name = back_express_name | |
| 143 | 150 | req.back_tracking_number = back_tracking_number | 
| 144 | 151 | req.request_status = TenancyShotRequestInfo.TENANCY_TRACKING_BACK | 
| 152 | + request_status_at = req.request_status_at | |
| 153 | + request_status_at[TenancyShotRequestInfo.TENANCY_TRACKING_BACK] = tc.utc_datetime() | |
| 154 | + req.request_status_at = request_status_at | |
| 145 | 155 | req.save() | 
| 146 | 156 |  | 
| 147 | 157 | if back_tracking_number and back_tracking_number != old_back_tracking_number: | 
| @@ -355,6 +355,8 @@ urlpatterns += [ | ||
| 355 | 355 | url(r'^admin/tenancy/shot/request/send$', tenancy_admin_views.shot_request_send, name='admin_tenancy_shot_request_send'), | 
| 356 | 356 | url(r'^admin/tenancy/shot/request/signed$', tenancy_admin_views.shot_request_signed, name='admin_tenancy_shot_request_signed'), | 
| 357 | 357 |  | 
| 358 | + url(r'^admin/tenancy/tracking/info$', tenancy_admin_views.shot_request_tracking_info, name='admin_shot_request_tracking_info'), | |
| 359 | + | |
| 358 | 360 | # 快递信息回调接口 | 
| 359 | 361 | url(r'^tenancy/tracking/info/callback$', tenancy_views.tenancy_tracking_info_callback, name='tenancy_tracking_info_callback'), | 
| 360 | 362 | ] | 
| @@ -57,10 +57,10 @@ class TenancyShotInfo(BaseModelMixin): | ||
| 57 | 57 |  | 
| 58 | 58 |  | 
| 59 | 59 | class TenancyShotRequestInfo(BaseModelMixin): | 
| 60 | - TENANCY_TRACKING_SEND = u'寄出' | |
| 61 | - TENANCY_TRACKING_SEND_SIGNED = u'寄出已签收' | |
| 62 | - TENANCY_TRACKING_BACK = u'寄回' | |
| 63 | - TENANCY_TRACKING_BACK_SIGNED = u'寄回已签收并检查无损坏' | |
| 60 | + TENANCY_TRACKING_SEND = u'寄出运送中' | |
| 61 | + TENANCY_TRACKING_SEND_SIGNED = u'寄出签收' | |
| 62 | + TENANCY_TRACKING_BACK = u'寄回运送中' | |
| 63 | + TENANCY_TRACKING_BACK_SIGNED = u'寄回签收' | |
| 64 | 64 |  | 
| 65 | 65 | AUDIT_PASS = 1 | 
| 66 | 66 | AUDIT_STATUS = ( | 
| @@ -152,7 +152,41 @@ class TenancyShotRequestInfo(BaseModelMixin): | ||
| 152 | 152 | 'back_tracking_signed': self.back_tracking_signed, | 
| 153 | 153 | 'audit_status': self.audit_status, | 
| 154 | 154 | 'request_status': self.request_status, | 
| 155 | -            'request_status_at': {k: tc.local_string(utc_dt=tc.string_to_utc_datetime(v, format='%Y-%m-%dT%H:%M:%S.%fZ')) for k, v in self.request_status_at.items()}, | |
| 155 | +            'request_status_at': {k: tc.local_string(utc_dt=tc.string_to_utc_datetime(v, format='%Y-%m-%d')) for k, v in self.request_status_at.items()}, | |
| 156 | + 'created_at': tc.local_string(tc.string_to_utc_datetime(self.created_at, format='%Y-%m-%d')), | |
| 157 | + } | |
| 158 | + | |
| 159 | + @property | |
| 160 | + def admindata(self): | |
| 161 | + try: | |
| 162 | + shot = TenancyShotInfo.objects.get(shot_id=self.shot_id) | |
| 163 | + except TenancyShotInfo.DoesNotExist: | |
| 164 | + shot = None | |
| 165 | +        return { | |
| 166 | + 'req_id': self.request_id, | |
| 167 | + 'request_id': self.request_id, | |
| 168 | + 'shot_id': self.shot_id, | |
| 169 | +            'shot_info': shot.data if shot else {}, | |
| 170 | + 'user_id': self.user_id, | |
| 171 | + 'name': self.name, | |
| 172 | + 'phone': self.phone, | |
| 173 | + 'location': self.location, | |
| 174 | + 'postcode': self.postcode, | |
| 175 | + 'purpose': self.purpose, | |
| 176 | + 'return_date': tc.local_date_string(self.return_date), | |
| 177 | + 'express_name': self.express_name, | |
| 178 | + 'express_com': self.express_com, | |
| 179 | + 'tracking_number': self.tracking_number, | |
| 180 | + 'tracking_info': self.tracking_info, | |
| 181 | + 'tracking_signed': self.tracking_signed, | |
| 182 | + 'tracking_signed_images': self.tracking_signed_images, | |
| 183 | + 'back_express_name': self.back_express_name, | |
| 184 | + 'back_express_com': self.back_express_com, | |
| 185 | + 'back_tracking_number': self.back_tracking_number, | |
| 186 | + 'back_tracking_info': self.back_tracking_info, | |
| 187 | + 'back_tracking_signed': self.back_tracking_signed, | |
| 188 | + 'audit_status': self.audit_status, | |
| 189 | + 'request_status': self.request_status, | |
| 190 | +            'request_status_at': {k: tc.local_string(utc_dt=tc.string_to_utc_datetime(v, format='%Y-%m-%d %H:%M:%S')) for k, v in self.request_status_at.items()}, | |
| 156 | 191 | 'created_at': tc.local_string(utc_dt=self.created_at), | 
| 157 | - 'updated_at': tc.local_string(utc_dt=self.updated_at), | |
| 158 | 192 | } |